
package id3tagger;

import java.io.*;
import org.jaudiotagger.audio.generic.AudioFileReader;
import org.jaudiotagger.audio.real.* ;
import org.jaudiotagger.audio.mp3.*;
import org.jaudiotagger.audio.mp4.*;
import org.jaudiotagger.audio.wav.*;
import org.jaudiotagger.audio.asf.*;
import org.jaudiotagger.audio.ogg.*;
import org.jaudiotagger.audio.flac.*;
import org.jaudiotagger.tag.*;
import org.jaudiotagger.tag.mp4.Mp4Tag;
import org.jaudiotagger.tag.id3.*;
import org.jaudiotagger.tag.flac.FlacTag;
import org.jaudiotagger.audio.asf.tag.*;
import org.jaudiotagger.tag.vorbiscomment.*;
import org.jaudiotagger.audio.AudioFile;
import java.io.RandomAccessFile;
import org.farng.mp3.id3.AbstractID3v1;
import org.farng.mp3.id3.AbstractID3v2;
import org.jaudiotagger.audio.AudioFileIO;

public class Song 
{
	private String titre;
        private String genre;
        private String album;
	private String artiste;
	private String cheminFic ;
	private String extension;
        private Tag tag;

        public Song(SongDB sdb) throws Exception
        {
            this(new File(sdb.getFileName()));
        }
	    
	    /**
	     * Construit une nouvelle instance de Song avec le nom de fichier
	     * @param nmfic
	     */
	    public Song(File nmfic) throws Exception 
	    {
                 //recupere le chemin absolu du fichier.

                if(!nmfic.exists())
                {
                    throw new Exception("Pas de fichier en entrée");
                }
	    	String chem = nmfic.getAbsolutePath();
	    	String ext = Song.getExtension(nmfic);
                //System.out.println("\nChemin : "+chem);
	    	if(ext.compareTo("mp3")==0)
	    	{
                    //System.out.println("\nMP3");
	    		MP3File mp3 = new MP3File(nmfic); 
                         // on va passer tous les tags en iD3 version 2.4 histoire d'uniformiser la bibliothèque.
                         //si tag v1
                        if(mp3.hasID3v1Tag())
                        {
                            //System.out.println("\nID3v1");
                             // à tester !!! peut être un cast à faire.
                             // passe tag ID3 v1 en ID3 v2.4
                             tag = new ID3v24Tag(mp3.getID3v1Tag());
                             // on passe à la volée les tag id3v1 en v2
                             mp3.setTag(tag);
                             mp3.commit();
                             //AudioFileIO.write(mp3);
                        }
                        //si tag v2
                        else if(mp3.hasID3v2Tag())
                        {
                            //System.out.println("\nID3v2");
                            //passe tag ID3 version 2 à la 2.4 (dernière version)
                            // pas forcement besoin de faire un commit à chaque fois.
                            tag = mp3.getID3v2TagAsv24();

                        }
                        // si pas de tag (qui sait) création d'un tag vide et mise dans le fichier mp3
                        // puis ecrit dessus.
                        else
                        {
                                //System.out.println("\nAputaing.");
                                tag = new ID3v24Tag();
                                // passage version 2.4 à la volée aussi
                                mp3.setTag(tag);
                                mp3.commit();
                                //AudioFileIO.write(mp3);
                        }
                        
	    		// on peut maintenant construire Song
                        /*Tag mp3Tag =(Tag) tag;
                        tag = mp3Tag;*/
                        this.readTag(tag, chem,ext);
                       /*
	    				System.out.println("\nConstruction. du boazar");
                        this.titre=new String(tag.getFirstTitle());
                        System.out.println("\ntitre");
                        this.album=new String(tag.getFirstAlbum());
                        System.out.println("\nalbum");
                        this.cheminFic = new String(chem);
                        this.extension = new String(ext);
                        this.genre = new String(tag.getFirstGenre());                        
                        this.artiste = new String(tag.getFirstArtist());*/
	    	}
                
	    	if(ext.compareTo("mp4")==0)
	    	{
                        Mp4TagReader mp4 = new Mp4TagReader();
                        tag = new Mp4Tag();
                        //passer en Random acces file nmfic 
                        RandomAccessFile raf = new RandomAccessFile(nmfic, "rws");
                        tag = mp4.read(raf);
                        this.readTag(tag, chem,ext);

                        /*
                        this.titre=new String(tag.getFirstTitle());
                        this.album=new String(tag.getFirstAlbum());
                        this.cheminFic = new String(chem);
                        this.extension = new String(ext);
                        this.genre = new String(tag.getFirstGenre());                        
                        this.artiste = new String(tag.getFirstArtist()); */                
	    	}
                
	    	if(ext.compareTo("wav")==0)
	    	{
                        WavFileReader wav = new WavFileReader();
                        tag = new WavTag();
                        AudioFile audio = new AudioFile();
                        audio=wav.read(nmfic);
                        tag =(WavTag) audio.getTag();
                       
                        Tag realTag=(Tag) tag;
	    		this.readTag(realTag, chem ,ext);
                       /*
	    				this.titre=new String(tag.getFirstTitle());
                        this.album=new String(tag.getFirstAlbum());
                        this.cheminFic = new String(chem);
                        this.extension = new String(ext);
                        this.genre = new String(tag.getFirstGenre());                        
                        this.artiste = new String(tag.getFirstArtist());   */                       
	    	}
	    	if(ext.compareTo("real")==0)
	    	{
                        RealFileReader real = new RealFileReader() ;
                        tag = new RealTag();
                        AudioFile audio = new AudioFile();
                        audio=real.read(nmfic);
                        tag = (RealTag) audio.getTag();
                        
                        Tag realTag=(Tag) tag;
	    		this.readTag(realTag, chem ,ext);
                        /*
	    				this.titre=new String(tag.getFirstTitle());
                        this.album=new String(tag.getFirstAlbum());
                        this.cheminFic = new String(chem);
                        this.extension = new String(ext);
                        this.genre = new String(tag.getFirstGenre());                        
                        this.artiste = new String(tag.getFirstArtist());*/
	    	}
                
	    	if(ext.compareTo("ogg")==0)
	    	{
	    				OggFileReader ogg = new OggFileReader();
	    				AudioFile audio = new AudioFile();
	    				audio=ogg.read(nmfic);
	    				tag = (VorbisCommentTag) audio.getTag();
	    				Tag oggTag=(Tag) tag;
	    				this.readTag(oggTag, chem,ext);
	    				/*
	    				this.titre=new String(tag.getFirstArtist());
                        this.album=new String(tag.getFirstAlbum());
                        this.cheminFic = new String(chem);
                        this.extension = new String(ext);
                        this.genre = new String(tag.getFirstGenre());                        
                        this.artiste = new String(tag.getFirstArtist());*/
	    	}
                if(ext.compareTo("wma")==0)
	    	{
	    				AsfFileReader asf = new AsfFileReader();
	    				AudioFile audio = new AudioFile();
	    				audio=asf.read(nmfic);
	    				tag = new AsfTag();
	    				tag=(AsfTag) audio.getTag();
	    				Tag asfTag=(AsfTag) tag;
                                        this.readTag( asfTag, chem ,ext);
	    				/*
	    				this.titre=new String(tag.getFirstArtist());
	    				this.album=new String(tag.getFirstAlbum());
	    				this.cheminFic = new String(chem);
	    				this.extension = new String(ext);
	    				this.genre = new String(tag.getFirstGenre());
	    				this.artiste = new String(tag.getFirstArtist());*/
	    	}
	    	if(ext.compareTo("flac")==0)
	    	{
	    				FlacFileReader flac = new FlacFileReader();
	    				FlacTagReader t = new FlacTagReader();
	    				AudioFile audio = new AudioFile();
	    				audio=flac.read(nmfic);
	    				//passer nmfic en randomaccessFIle();
	    				RandomAccessFile raf = new RandomAccessFile(nmfic, "rws");
	    				FlacTag tag = t.read(raf);
	    				tag= (FlacTag) audio.getTag();
	    				Tag flacTag=(Tag) tag;
	    				this.readTag(flacTag, chem,ext);
	    	
	    	}
	    }	

	    
	    /**
	     * Cette méthode lit le tag du morceau
	     * @throws Exception
	     */
	    public void readTag(Tag tag, String chem, String ext) throws Exception
	    {
	    	//System.out.println("\nConstruction du bazar");
                //System.out.println("chemin:"+chem);
                this.titre=new String(tag.getFirstTitle());
                if(titre == null) System.out.println("Pas de titre");
                this.album=new String(tag.getFirstAlbum());
                this.cheminFic = new String(chem);
                this.extension = new String(ext);
                this.genre = new String(tag.getFirstGenre());
                this.artiste = new String(tag.getFirstArtist());
	    }

	    /**public Tag getTag()
	    {
	        
	    }*/

	    /**
	     * Sauvegarde le tag courant dans la base de données
	     * @throws Exception
	     */
        /**    public void uniformise(Tag tag)
         *   {
         *
         * }
         */
            public String insertInto()
            {
                String ii = "INSERT INTO songs (filename, genre, artiste, album, titre) VALUES ('";
                return ii+
                        cheminFic.replace("'", "''")+"', '"+
                        genre.replace("'", "''")+"', '"+
                        artiste.replace("'", "''")+"', '"+
                        album.replace("'", "''")+"', '"+
                        titre.replace("'", "''")+
                        "');";
            }

	    public void save() throws Exception
	    {
	        
	    }

	    /**
	     * Ecrit le tag courant sur le fichier
	     * @throws Exception
	     */
	    public void write() throws Exception
	    {
	    	
	    }

            public void modifieTag(String artiste, String album, String genre) throws Exception
            {
               /*AudioFileReader lecteur;
               File f = new File(this.cheminFic);
               if(Song.getExtension(f).compareTo("MP3")==0)
               {
                lecteur = new MP3FileReader();
               }
               else if(Song.getExtension(f).compareTo("WAV")==0)
               {
                lecteur = new WavFileReader();
               }
               else if(Song.getExtension(f).compareTo("OGG")==0)
               {
                 lecteur = new OggFileReader();
               }
               else if(Song.getExtension(f).compareTo("FLAC")==0)
               {
                lecteur = new FlacFileReader();
               }
               else if(Song.getExtension(f).compareTo("MP4")==0)
               {
                lecteur = new Mp4FileReader();
               }
               else if(Song.getExtension(f).compareTo("ASF")==0)
               {
                lecteur = new AsfFileReader();
               }
               else
               {
                lecteur = new RealFileReader();
               }
               AudioFile musique = lecteur.read(f);
               this.tag = musique.getTag();
               /*
                * Tester les valeurs à modifier.
               */
                if(Song.getExtension(new File(cheminFic)).equalsIgnoreCase("mp3"))
                {//System.out.println("Lecture du fichier...");
                        org.farng.mp3.MP3File mp3f = new org.farng.mp3.MP3File(new File(cheminFic));
                        AbstractID3v2 tagv2;
                        AbstractID3v1 tagv1;
                        tagv2 = mp3f.getID3v2Tag();
                        tagv1 = mp3f.getID3v1Tag();

                        //System.out.println("Ecriture Artiste : "+artiste);
                       if(artiste != null)
                       {
                          tagv1.setLeadArtist(artiste);
                          tagv2.setLeadArtist(artiste);
                       }

                        //System.out.println("Ecriture album "+album);
                       if(album != null)
                       {
                          tagv1.setAlbumTitle(album);
                          tagv2.setAlbumTitle(album);
                       }

                        //System.out.println("Ecriture genre : "+genre);
                       if(genre != null)
                       {
                          //tagv1.setSongGenre(genre);
                          tagv2.setSongGenre(genre);
                       }
                   mp3f.save();
                }

                else throw new Exception("Les autres formats ne sont pas supportés pour l'instant");
             }
	/**
     * Obtenir l'extension d'un fichier
     */
	public static String getExtension(File nomFichier)
    	{
        	String ext = null;
        	String nom = nomFichier.getName();
        	
        	int i = nom.lastIndexOf('.');

        	if (i > 0 &&  i < nom.length() - 1) 
        		{
        			ext = nom.substring(i+1).toLowerCase();
        		}
        	return ext;
    	}

    @Override
        public String toString()
        {
            String s = "-----\nArtiste: "+artiste+"\nAlbum: "+album+"\nTitre: "+titre+"\nChemin: "+cheminFic+"\nGenre: "+genre+"\n-----";
            return s;
        }
}